/**
 * 
 */
package datamodel.trie;

import java.util.ArrayList;
import java.util.List;

/**
 * class for a node in the trie<br>
 * save reference to its children and parent
 * 
 * @author Jakob Karolus, Kevin Munk
 * @version 1.0
 *
 */
public class TrieNode {
	
	List<TrieNode> nextElements = new ArrayList<TrieNode>(16);
	boolean[] codes = new boolean[16];

	public TrieNode(){
		for(int i = 0; i <16; i++) {
			nextElements.add(null);
			codes[i] = false;
		}

//		codes[0]="0000";
//		codes[1]="0001";
//		codes[2]="0010";
//		codes[3]="0011";
//		codes[4]="0100";
//		codes[5]="0101";
//		codes[6]="0110";
//		codes[7]="0111";
//		codes[8]="1000";
//		codes[9]="1001";
//		codes[10]="1010";
//		codes[11]="1011";
//		codes[12]="1100";
//		codes[13]="1101";
//		codes[14]="1110";
//		codes[15]="1111";
	}
	
	public void setValue(String code) {
		codes[Integer.parseInt(code, 2)] = true;
	}
	
	public boolean hasValue(String code) {
		return codes[Integer.parseInt(code, 2)];
	}
	
	/**
	 * Setzt den entsprechenden Nachfolgerknoten 
	 * (Da alle Knoten gleich sind, sind keine weiteren Paramter notwendig).
	 * @param code binärer Code - nächste Knotenposition -
	 */
	public void setNode(String code) {
		int pos = Integer.parseInt(code, 2);
		
		setValue(code);
		if(nextElements.get(pos) == null) {
			nextElements.set(pos, new TrieNode());
		}
	}

	public TrieNode getNode(String code) {
		int pos = Integer.parseInt(code, 2);
		return nextElements.get(pos);
	}

	public TrieNode getNode(int pos) {
		return nextElements.get(pos);
	}

	public void clearNext() {
		for(int i = 0; i <16; i++) {
			nextElements.set(i, null);
		}
	}

	public boolean hasNode(String code) {
		int pos = Integer.parseInt(code, 2);
		return nextElements.get(pos) != null;
	}
}
